package edu.hwadee.BEIS.service;

import java.util.List;
import java.util.Set;

import edu.hwadee.BEIS.dto.*;
import edu.hwadee.BEIS.entity.*;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

/**
 * 系统管理Service接口
 */
public interface SystemManageService {

	/**
	 * 验证注册凭证
	 * @param userType  用户类型
	 * @param code  注册凭证
	 * @return
	 */
	boolean validCertificate(String userType, String code);
	
	/**
	 * 注册学校用户
	 * @return
	 */
	boolean register(SchoolUser schoolUser);

	/**
	 * 注册区县用户
	 * @param countyUserInfor
	 * @return
	 */
	boolean register(CountyUserDTO countyUserInfor);

	/**
	 * 注册市局用户
	 * @param cityUserInfor
	 * @return
	 */
	boolean register(CityUserDTO cityUserInfor);

	/**
	 * 注册高级用户
	 * @param leaderUserInfor
	 * @return
	 */
	boolean register(LeaderUserDTO leaderUserInfor);
	
	/**
	 * 判断学校是否已存在
	 * @param school_id
	 * @return
	 */
	boolean schoolIsExisted(String school_id);

	/**
	 * 判断学校用户集合是否存在
	 * @param school_user_idSet
	 * @return
	 */
	boolean schoolUsersAreExisted(Set<String> school_user_idSet);
	
	/**
	 * 判断教育部门行政编号是否被使用
	 * @param admin_code  行政编号
	 * @return
	 */
	boolean adminCodeIsBeenUsed(String admin_code);

	/**
	 * 判断区县用户是否存在
	 * @param countyUser_id
	 * @return
	 */
	boolean countyUserIsExisted(String countyUser_id);

	/**
	 * 判断市局用户是否存在
	 * @param cityUser_id
	 * @return
	 */
	boolean cityUserIsExisted(String cityUser_id);

	/**
	 * 判断高级用户是否存在
	 * @param leaderUser_id
	 * @return
	 */
	boolean leaderUserIsExisted(String leaderUser_id);
	
	/**
	 * 登录
	 * @param userType  用户类型
	 * @param user_id  用户名
	 * @param pwd  密码
	 * @return
	 */
	boolean login(String userType, String user_id, String pwd);
	
	/**
	 * 封装学校用户信息
	 * @param schoolUserDTO
	 */
	SchoolUser schoolUserInfor2Object(SchoolUserDTO schoolUserDTO) throws Exception;
	
	/**
	 * 判断开放填报记录是否存在
	 * @param type_code
	 * @return
	 */
	boolean OpenModifyIsExisted(Integer type_code);
	
	/**
	 * 保存开放填报记录
	 * @param openModify
	 */
	void saveOpenModify(OpenModify openModify);
	
	/**
	 * 转换开放填报信息数据为实体类
	 * @param openModifyInfor
	 * @return
	 * @throws Exception
	 */
	OpenModify OpenModifyInfor2Object(OpenModifyDTO openModifyInfor) throws Exception;
	
	/**
	 * 获取所有开放填报信息
	 * @return
	 */
	List<OpenModify> getAllOpenModify();

	/**
	 * 获取通过的所有项目申报结果（分页形式）
	 * @param pageable
	 * @return
	 */
	Page<ProjectDeclare> getAllProjectDeclare(Pageable pageable);

	/**
	 * 获取通过的中央项目申报结果（分页形式）
	 * @param pageable
	 * @return
	 */
	Page<ProjectDeclare> getCountryProjectDeclare(Pageable pageable);

	/**
	 * 获取通过的省级项目申报结果（分页形式）
	 * @param pageable
	 * @return
	 */
	Page<ProjectDeclare> getProvinceProjectDeclare(Pageable pageable);

	/**
	 * 获取通过的市级项目申报结果（分页形式）
	 * @param pageable
	 * @return
	 */
	Page<ProjectDeclare> getCityProjectDeclare(Pageable pageable);
	
	/**
	 * 项目分析图表数据转换为实体类
	 * @param analysisiDiagramInfor
	 * @return
	 */
	AnalysisDiagram analysisDiagramData2Object(AnalysisDiagramDTO analysisiDiagramInfor) throws Exception;
	
	/**
	 * 判断项目申报记录是否存在
	 * @param project_id
	 * @return
	 */
	boolean projectDeclareIsExisted(Integer project_id);
	
	/**
	 * 保存项目分析图表
	 * @param analysisDiagram
	 */
	void saveAnalysisDiagram(AnalysisDiagram analysisDiagram);
	
	/**
	 * 通过项目申报ID获得其项目分析图表记录
	 * @param projectDeclare_Id
	 * @return
	 * @throws Exception
	 */
	List<AnalysisDiagram> getAnalysisDiagramByProjectId(Integer projectDeclare_Id) throws Exception;
	
	/**
	 * 通过分析图表ID删除记录
	 * @param diagram_id
	 */
	void deleteAnalysisDiagram(Integer diagram_id) throws Exception;

    /**
     * 获取所有凭证
     * @return
     */
	List<Certificate> getAllCertificate();

    /**
     * 保存凭证
     * @param certificate
     */
	void saveCertificate(Certificate certificate);

    /**
     * 删除凭证
     * @param certificateId
     */
	void deleteCertificate(Integer certificateId);

    /**
     * 分页获取学校用户
     * @param pageable
     * @return
     */
    Page<SchoolUser> getAllSchoolUser(Pageable pageable);

    /**
     * 分页获取区县用户
     * @param pageable
     * @return
     */
    Page<CountyUser> getAllCountyUser(Pageable pageable);

    /**
     * 分页获取市局用户
     * @param pageable
     * @return
     */
    Page<CityUser> getAllCityUser(Pageable pageable);

    /**
     * 分页获取高级用户
     * @param pageable
     * @return
     */
    Page<LeaderUser> getAllLeaderUser(Pageable pageable);

	/**
	 * 修改学校用户信息
	 * @param schoolUserDTO
	 */
	void modifySchoolUser(SchoolUserDTO schoolUserDTO);

	/**
	 * 修改区县用户信息
	 * @param countyUserDTO
	 */
    void modifyCountyUser(CountyUserDTO countyUserDTO);

	/**
	 * 修改市局用户信息
	 * @param cityUserDTO
	 */
	void modifyCityUser(CityUserDTO cityUserDTO);

	/**
	 * 修改高级用户信息
	 * @param leaderUserDTO
	 */
    void modifyLeaderUser(LeaderUserDTO leaderUserDTO);

	/**
	 * 修改密码
	 * @param user_type
	 * @param user_id
	 * @param newPwd
	 */
	boolean modifyPwd(String user_type, String user_id, String newPwd);

	/**
	 * 获取学校用户公告
	 * @param schoolUserId
	 * @return
	 */
	Page<Announcement> findSchoolUserAnnoucement(Pageable pageable, String schoolUserId);

	/**
	 * 获取区县用户公告
	 * @param countyUserId
	 * @return
	 */
	Page<Announcement> findCountyUserAnnouncement(Pageable pageable, String countyUserId);

	/**
	 * 获取高级用户公告
	 * @param leaderUserId
	 * @return
	 */
	Page<Announcement> findLeaderUserAnnouncement(Pageable pageable, String leaderUserId);

	/**
	 * 获取市局发布的公告
	 * @param cityUserId
	 * @return
	 */
	Page<Announcement> findCityUserAnnouncement(Pageable pageable, String cityUserId);

	/**
	 * 发布公告
	 * @param annoucementDTO
	 */
	void publishAnnouncement(AnnoucementDTO annoucementDTO, String cityUserId);

}
